WorkflowsでCloud Storage用コネクタを用いてオブジェクト一覧を取得してみた
概要
Workflowsには多くのコネクタがあります。Cloud Run、Pub/Sub、Batch・・・本当にたくさんあるので一覧を見たい方はリファレンスをどうぞ。
そんなたくさんあるコネクタの中でも今回使ってみるのはCloud Storage用のコネクタです。
Cloud Storage用のコネクタを用いると、バケット一覧の取得・メタデータの取得・オブジェクトの削除・バケットの削除などCloud Storageに対する各種操作をWorkflowsから容易に行うことができます。
※コネクタとはGoogle Cloudの各種リソースに対して簡単にアクセスできるように用意されたものです。
call: コネクタ
の形式で呼び出すことができ、各コネクタごとにさまざまなパラメータの設定が可能です。コネクタを用いるとGoogle Cloudの各種リソースをWorkflowsから呼び出すことが容易になります。各種設定値をYAMLまたはJSONにて記載することでリソース呼び出し時の設定を実装することができます。各コネクタごとにリファレンスも整備されていて、容易にリソース呼び出しをすることができます。
やりたいこと
たくさんあるCloud Storage用コネクタの機能の中でも、今回やりたいことは以下です。
- WorkflowsでCloud Storage用コネクタを用いてCloud Storageのバケット内のオブジェクト一覧を取得したい。プレフィックス付きで。
とりあえずCloud Storage用コネクタのリファレンスを読み込んでみて以下のコネクタを用いてワークフローを組んでみました。
googleapis.storage.v1.objects.list
リファレンスを見るとバケット名だけが必須項目なのでバケット名を引数にします。
bucket:Required. Name of the bucket in which to look for objects.
とりあえずソースコード全文です
- init:
assign:
- bucket_name: "バケット名"
- list:
call: googleapis.storage.v1.objects.list
args:
bucket: ${bucket_name}
result: listResult
- printList:
for:
value: val
in: ${listResult.items}
steps:
- logStep:
call: sys.log
args:
text: ${val.name}
severity: DEBUG
簡潔に解説します。
init
ステップ
- init:
assign:
- bucket_name: "バケット名"
- 目的:
bucket_name
という変数に、対象とするCloud Storageバケットの名前("バケット名")を代入します。この変数は後続のステップで使用します。 - ポイント: ワークフロー内で使用する変数を初期化するためのステップです。
list
ステップ
- list:
call: googleapis.storage.v1.objects.list
args:
bucket: ${bucket_name}
result: listResult
- 目的:Cloud Storage用コネクタを呼び出して、指定されたバケット内のオブジェクトのリストを取得します。
- 詳細:
call
:googleapis.storage.v1.objects.list
は、Cloud Storageのバケット内のオブジェクトの一覧を取得するコネクタ(API)です。args
:bucket
にbucket_name
の変数を渡して、どのバケットのオブジェクトを取得するか指定します。result
: APIの呼び出し結果をlistResult
という変数に格納します。この変数には、バケット内のオブジェクトの一覧が含まれます。
printList
ステップ
- printList:
for:
value: val
in: ${listResult.items}
steps:
- logStep:
call: sys.log
args:
text: ${val.name}
severity: DEBUG
- 目的:
listResult.items
から取得した各オブジェクトのname
をログに出力します。 - 詳細:
for
:listResult.items
の各要素を反復処理します。value: val
で、各オブジェクトをval
という変数に代入します。steps
: 各オブジェクトに対して実行するステップを定義します。logStep
:sys.log
を呼び出して、オブジェクト名をログに出力します。text
: ログに出力するテキストを指定します。ここでは、オブジェクトの名前(${val.name}
)を出力します。severity
: ログの重要度をDEBUG
に設定します。
補足:オブジェクト一覧を取得してみたところ以下のレスポンスでした。(イメージを掴むためのサンプルです)
{
"items": [
{
"bucket": "****",
"contentType": "text/plain",
"crc32c": "AAAAAA==",
"etag": "****",
"generation": "1728048465461179",
"id": "****",
"kind": "storage#object",
"md5Hash": "****",
"mediaLink": "****",
"metageneration": "1",
"name": "directory1/test1.txt",
"selfLink": "****",
"size": "0",
"storageClass": "STANDARD",
"timeCreated": "2024-10-04T13:27:45.464Z",
"timeStorageClassUpdated": "2024-10-04T13:27:45.464Z",
"updated": "2024-10-04T13:27:45.464Z"
}
],
"kind": "storage#objects"
}
リファレンスと上記のレスポンスデータからname
に今回目的とするデータ(オブジェクトのプレフィックス付きファイル名)が取得できると判断してワークフローを組みました。
実行してみる
Cloud Storageのバケットにあらかじめ以下の構成でオブジェクトを作成しました。
/
├── hoge1/
│ └── hoge2/
│ └── test4.txt
├── test1.txt
├── test2.txt
├── test3.txt
└── testtest/
└── test1.txt
上記の通りにファイル名が出力されていることを期待しています。
実行結果は以下です。
hoge1/hoge2/test4.txt
やtesttest/test1.txt
などプレフィックスもちゃんと取得できていることが確認できました。
コネクタを用いるとシンプルにやりたいことができるのでありがたいですね。
所感
半年ほど前に、以下のブログを書いたときは本コネクタを用いた実装ではありませんでした。
このときはCloud Run関数(旧Cloud Functions)を呼び出して、pythonで指定バケットのオブジェクト一覧を取得するということをしていました。
オブジェクト一覧を取得するだけであれば、本コネクタを用いる方がコスト面・実装面で圧倒的に優位だなと考えます(なんでCloud Functionsで実装しちゃったんだろう・・・恥ずかしい・・・)。
何かWorkflowsでやりたいことがあったとき、Google Cloudのサービスに対しての操作であればまずはコネクタを探してみるというのが良いのではないかと考えます。
今回は過去の振り返りも兼ねて書いた記事でもあるのですが、今後面白いコネクタを見つけたらまた記事にしたいなと思います。
それではまた。ナマステー